package org.openapi.task;

import com.alibaba.fastjson2.JSONArray;
import lombok.extern.slf4j.Slf4j;
import org.openapi.consts.SqlType;
import org.openapi.domain.ApiSql;
import org.openapi.service.IApiLoaderService;
import org.openapi.service.IDbService;
import org.openapi.utils.JsUtil;
import org.openapi.utils.StrUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.Arrays;

/**
 * 数据处理任务
 */
@Component
@Slf4j
public class DataTask {

    @Autowired
    private IApiLoaderService apiLoaderService;
    @Autowired
    private IDbService dbService;

    /**
     * 执行指定的批处理SQL脚本
     */
    public void batch(String code){
        ApiSql apiSql = apiLoaderService.getSql(code);
        if(apiSql == null){
            log.error("数据处理任务 {} 不存在", code);
            return;
        }

        if(!apiSql.getType().equalsIgnoreCase(SqlType.BATCH.getCode())){
            log.error("数据处理任务不支持 {} 类型", apiSql.getType());
            return;
        }

        String sql = apiSql.getContent();
        if(apiSql.isFun()){
            sql = JsUtil.eval(sql, null);
        }

        //替换当前时间，dt和now是当前日期时间，day和date是当前日期
        sql = sql.replaceAll("\\$\\{dt\\}", StrUtil.date(StrUtil.YYYY_MM_DD_HH_MM_SS));
        sql = sql.replaceAll("\\$\\{now\\}", StrUtil.date(StrUtil.YYYY_MM_DD_HH_MM_SS));
        sql = sql.replaceAll("\\$\\{day\\}", StrUtil.date(StrUtil.YYYY_MM_DD));
        sql = sql.replaceAll("\\$\\{date\\}", StrUtil.date(StrUtil.YYYY_MM_DD));
        sql = sql.trim();

        //返回结果可能是个数组，也可能是多个sql用;隔开
        if(sql.startsWith("[")){
            JSONArray.parseArray(sql, String.class).stream().forEach(s -> {
                int rows = dbService.exec(s);
                log.info("数据处理任务 {}, exec {}, affect rows{}", apiSql.getCode(), s, rows);
            });
        }else{
            Arrays.stream(sql.split(";")).forEach(s -> {
                int rows = dbService.exec(s);
                log.info("数据处理任务 {}, exec {}, affect rows{}", apiSql.getCode(), s, rows);
            });
        }
    }
}
